FFI (rs)
RustでFFI
#wip
gpt-5.icon
extern "C"
code:rust
extern "C"
これは ABI(呼び出し規約)を C と同じにする という指定です。
つまり:
引数の渡し方
スタックの扱い
シンボル名のルール
などを C コンパイラと互換にします。
用途:
C から Rust の関数を呼びたい
ブートローダや OS が「C の main」を期待している
Rust 標準ランタイムを使わず自前で起動したい
最小サンプル(no_std / no_main)
Linux などで動かすには少し設定が要りますが、構造だけ示します。
code:rust
#!no_std
#!no_main
use core::panic::PanicInfo;
#no_mangle
pub extern "C" fn main() -> ! {
// ここがプログラムの開始点
let mut x = 0;
x += 1;
// 戻らないので無限ループ
loop {}
}
#panic_handler
fn panic(_info: &PanicInfo) -> ! {
loop {}
}
よく使われる例
"C"
code:rust
extern "C" fn foo() {}
"system"
code:rust
extern "system" fn foo() {}
OS 依存の “標準 ABI”。
Linux/macOS → 実質 "C"
Windows → WinAPI 用 ABI
Windows FFI では "C" より "system" が推奨されることが多いです。
WASM
code:rust
extern "wasm" fn foo() {}
/mrsekut-book-4873118557/566 (21.8 外部言語関数: CとC++の関数をRustから呼び出す)
/mrsekut-book-4297105594/524 (第12章 FFI)